-- Lua Battle System - 技能管理

local Logger = require("utils.logger")
local ConfigLoader = require("utils.config_loader")
local Skill = require("skills.skill")
local TargetSelector = require("skills.target_selector")

local SkillManager = {
    skills = {}, -- 已注册的技能列表
    skill_configs = {}, -- 技能配置缓存
    target_selector = nil -- 目标选择器实例
}

-- 初始化技能管理器
function SkillManager:init()
    -- 初始化目标选择器
    self.target_selector = TargetSelector:new()
    Logger.info("技能管理器初始化完成")
end

-- 注册技能
function SkillManager:register_skill(skill)
    if not skill.id then
        Logger.error("技能ID不能为空")
        return false
    end
    
    self.skills[skill.id] = skill
    Logger.debug("技能注册成功: " .. skill.name .. " (" .. skill.id .. ")")
    return true
end

-- 从配置文件加载技能
function SkillManager:load_skill_from_config(skill_id)
    if self.skill_configs[skill_id] then
        return self.skill_configs[skill_id]
    end
    
    -- 从配置文件加载技能配置
    local skill_config = ConfigLoader:load_skill_config(skill_id)
    if not skill_config then
        Logger.error("无法加载技能配置: " .. skill_id)
        return nil
    end
    
    -- 创建技能实例
    local skill = Skill:new(skill_config)
    skill:init()
    
    -- 注册技能
    self:register_skill(skill)
    
    -- 缓存技能配置
    self.skill_configs[skill_id] = skill
    
    return skill
end

-- 获取技能
function SkillManager:get_skill(skill_id)
    -- 先从已注册的技能中查找
    local skill = self.skills[skill_id]
    if skill then
        return skill
    end
    
    -- 如果找不到，尝试从配置文件加载
    return self:load_skill_from_config(skill_id)
end

-- 获取所有技能
function SkillManager:get_all_skills()
    return self.skills
end

-- 释放技能
function SkillManager:cast_skill(caster, skill_id, target, battle_state)
    -- 获取技能
    local skill = self:get_skill(skill_id)
    if not skill then
        Logger.error("技能不存在: " .. skill_id)
        return nil
    end
    
    -- 检查技能是否可用
    if not skill:is_usable(caster, battle_state) then
        Logger.error(caster.name .. " 无法使用技能: " .. skill.name)
        return nil
    end
    
    -- 执行技能
    local result = skill:execute(caster, target, battle_state)
    if not result then
        Logger.error("技能执行失败: " .. skill.name)
        return nil
    end
    
    -- 更新技能冷却
    self:update_skill_cooldowns(caster)
    
    return result
end

-- 更新技能冷却
function SkillManager:update_skill_cooldowns(caster)
    for _, skill in ipairs(caster.skills) do
        skill:update_cooldown()
    end
end

-- 重置技能冷却
function SkillManager:reset_skill_cooldowns(caster)
    for _, skill in ipairs(caster.skills) do
        skill:reset_cooldown()
    end
    Logger.info(caster.name .. " 的所有技能冷却已重置")
end

-- 检查技能目标是否有效
function SkillManager:is_valid_target(skill, caster, target)
    -- 检查目标类型
    if skill.target_type == "enemy" and target.team_id == caster.team_id then
        Logger.warn("技能 " .. skill.name .. " 只能对敌人使用")
        return false
    end
    
    if skill.target_type == "ally" and target.team_id ~= caster.team_id then
        Logger.warn("技能 " .. skill.name .. " 只能对队友使用")
        return false
    end
    
    if skill.target_type == "self" and target.id ~= caster.id then
        Logger.warn("技能 " .. skill.name .. " 只能对自己使用")
        return false
    end
    
    -- 检查目标是否存活
    if not target.is_alive then
        Logger.warn("目标已阵亡，无法使用技能")
        return false
    end
    
    return true
end

-- 获取可用技能列表
function SkillManager:get_usable_skills(caster, battle_state)
    local usable_skills = {}
    
    for _, skill in ipairs(caster.skills) do
        if skill:is_usable(caster, battle_state) then
            table.insert(usable_skills, skill)
        end
    end
    
    return usable_skills
end

-- 获取技能冷却时间
function SkillManager:get_skill_cooldown(skill_id)
    local skill = self:get_skill(skill_id)
    if not skill then
        return -1
    end
    
    return skill.current_cooldown
end

-- 预加载所有技能
function SkillManager:preload_all_skills()
    Logger.info("开始预加载所有技能...")
    
    -- TODO: 实现从配置目录加载所有技能的逻辑
    -- 这里需要获取配置目录中的所有技能文件，暂时简化处理
    
    Logger.info("技能预加载完成")
end

-- 导出模块
return SkillManager